package demo.generator;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Collection;

import org.apache.commons.io.FileUtils;

/**
 * 模板优化器<br>
 * 现在发现直接使用mybatis-plus generator提供的模板生成代码存在格式问题:<br>
 * 1.模板文件的指令的缩进带入到最终生成的代码中<br>
 * <br>
 * 为了解决这个问题，专门开发了这个模板优化器，将mybatis-plus generator提供的模板文件放在raw目录下，优化后的模板文件输出到templates目录下<br>
 * 可以把templates目录下优化后的模板文件复制到需要的项目里使用
 */
public class TemplateOptimizer {

	/**
	 * 获取指定目录下指定后缀名的所有文件
	 * @param dir 指定目录
	 * @param fileExtArr 后缀名数组
	 * @return Collection<File>
	 */
	private static Collection<File> getFiles(String dir, String[] fileExtArr) {
		File dirFile = new File(dir);
		return FileUtils.listFiles(dirFile, fileExtArr, false);
	}

	/**
	 * 对字符串进行left trim
	 * @param str 字符串
	 * @return left trim后的字符串
	 */
	public static String ltrim(String str) {
		return str.replaceAll("^\\s+", "");
	}

	/**
	 * 对一行文本进行优化
	 * @param lineContent
	 * @return
	 */
	private static String optimizeLine(String lineContent) {
		String ltrimContent = ltrim(lineContent);
		if (ltrimContent.startsWith("#")) {
			return ltrimContent;
		} else {
			return lineContent;
		}
	}

	/**
	 * 优化原生的模板文件后输出到目标文件
	 * @param rawFilePath
	 * @param outFilePath
	 */
	private static void optimizeRawFile(String rawFilePath, String outFilePath) {
		Path path = Paths.get(rawFilePath);
		try (BufferedReader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8);
				BufferedWriter writer = new BufferedWriter(
						new OutputStreamWriter(new FileOutputStream(outFilePath), StandardCharsets.UTF_8))) {
			String lineContent;
			while ((lineContent = reader.readLine()) != null) {
				writer.write(optimizeLine(lineContent));
				writer.newLine();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) throws IOException {
		// 指定项目根目录
		String baseDir = "E:/git_oschina/bj_renyong/mybatis-plus3-demo";
		// 原生模板所在目录
		String rawDir = "/src/test/resources/raw";
		// 优化后模板所在目录
		String templatesDir = "/src/test/resources/templates";
		// 需要优化文件的后缀名
		String[] fileExtArr = { "vm" };

		String templatesFullDir = baseDir + templatesDir;
		// 强制创建目标目录
		FileUtils.forceMkdir(new File(templatesFullDir));
		// 读取raw目录下的文件
		Collection<File> rawFiles = getFiles(baseDir + rawDir, fileExtArr);
		for (File rawFile : rawFiles) {
			String outFilePath = templatesFullDir + "/" + rawFile.getName();
			optimizeRawFile(rawFile.getAbsolutePath(), outFilePath);
		}
	}
}
